﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prisa.Entities;
using Prisa.DataAccess;
using Microsoft.Practices.Unity;

namespace Prisa.BussinesLogic
{
    public class VentaBL:IVentaBL
    {
        [Dependency]
        public IVentaDAO ventaDAO { get; set; }

        [Dependency]
        public IDetalleVentaDAO detalleVeDAO { get; set; }

        [Dependency]
        public IProductoDAO productoDAO { get; set; }

        [Dependency]
        public IHistorialVentaDAO historialDAO { get; set; }

        [Dependency]
        public ICategoriaDAO categoriaDAO { get; set; }
        
        public List<VENTA> GetAllFromVentas()
        {
            return ventaDAO.GetAllFromVentas();
        }
        
        public List<VENTA> GetFromVentabyCliente(string cliente)
        {
            return ventaDAO.GetFromVentabyCliente(cliente);
        }
        
        public List<VENTA> GetFromVentabyClienteAndFecha(string cliente, DateTime? fecha)
        {
            return ventaDAO.GetFromVentabyClienteAndFecha(cliente, fecha);
        }

        public VENTA GetFromVentaById(int id)
        {
            return ventaDAO.GetFromVentaById(id);
        }

        public void AddVenta(VENTA venta)
        {
            var msg = "";
            var ok = venta.Validate(out msg);

            if (ok)
            {
                ValidarStocks(venta);
                ventaDAO.AddVenta(venta);

                #region UpdateStock

                foreach (var item in venta.DETALLEVENTAs)
                {
                    var producto = productoDAO.GetFromProductoById(item.ProductoId);
                    var categoria = categoriaDAO.GetFromCategoriaById(producto.CategoriaId);

                    #region AddHistorial
                    var historial_ventas = new HISTORIAL_VENTAS
                    {
                        ProductoId = item.ProductoId,   
                        Fecha = DateTime.Today.Date,
                        Precio = producto.Precio - item.Descuento,   
                        Cantidad = Convert.ToInt32(item.Cantidad),
                        Total = item.Cantidad * (producto.Precio - item.Descuento),
                        Contado = true,  Credito = false,  Menudeo = false,
                        Cancelada = false,    Observacion = " ",
                    };
                    historialDAO.AddHistorialVentas(historial_ventas);
                    #endregion

                    //actualizar stock venta                    
                    var actproducto = producto;
                    actproducto.CATEGORIA = categoria;
                    actproducto.Stock = producto.Stock - item.Cantidad;
                    productoDAO.UpdateProducto(actproducto);
                }
                #endregion
            }
            else
            {
                throw new Exception(msg);
            }
        }

        private void ValidarStocks(VENTA venta)
        {
            foreach (var item in venta.DETALLEVENTAs)
            {
                var producto = productoDAO.GetFromProductoById(item.PRODUCTO.Id);
               
                    if (item.Cantidad > producto.Stock)
                    {
                        throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                          " solo quedan {1} Und.", producto.Descripcion, producto.Stock));
                    }
            }
        }

        public void CancelarVenta(int id)
        {
            ventaDAO.CancelarVenta(id);
        }

        public void EliminarVentaToNuevoCierreCaja(int id)
        {
            ventaDAO.EliminarVentaToNuevoCierreCaja(id);
        }


        public List<VENTA> GetFromVentasbyFechaAndClienteAndFactura(DateTime? fec1, DateTime? fec2, string cliente, bool factura)
        {
            return ventaDAO.GetFromVentasbyFechaAndClienteAndFactura(fec1, fec2, cliente, factura);
        }

        public List<VENTA> GetFromVentasbyFechaAndClienteAndBoleta(DateTime? fec1, DateTime? fec2, string cliente)
        {
            return ventaDAO.GetFromVentasbyFechaAndClienteAndBoleta(fec1, fec2, cliente);
        }

        public List<VENTA> GetFromVentasbyFechaAndCliente(DateTime? fec1, DateTime? fec2, string cliente)
        {
            return ventaDAO.GetFromVentasbyFechaAndCliente(fec1, fec2, cliente);
        }
    }
}
